themingengine: Don't transform icon shadows
authorBenjamin Otte <otte@redhat.com>
Mon, 12 May 2014 02:14:10 +0000 (04:14 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 14 May 2014 02:28:35 +0000 (04:28 +0200)
.. by -gtk-icon-transform. We want a rotating spinner's shadow to still
be directed towards bottom right.

gtk/gtkthemingengine.c

index 64b9f8ff7c4c1c5f53c695be311733a08692f27b..4cc9832eb6cdd97b016025ef137e99acfd36cfbe 100644 (file)
@@ -1032,7 +1032,7 @@ render_icon_image (GtkThemingEngine *engine,
                    double            height)
 {
   const GtkCssValue *shadows;
-  cairo_matrix_t matrix;
+  cairo_matrix_t matrix, transform_matrix;
   GtkCssImage *image;
 
   image = _gtk_css_image_value_get_image (_gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_ICON_SOURCE));
@@ -1041,22 +1041,29 @@ render_icon_image (GtkThemingEngine *engine,
 
   shadows = _gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_ICON_SHADOW);
 
-  if (_gtk_css_transform_value_get_matrix (_gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_ICON_TRANSFORM), &matrix))
+  cairo_translate (cr, x, y);
+
+  if (_gtk_css_transform_value_get_matrix (_gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_ICON_TRANSFORM), &transform_matrix))
     {
-      cairo_translate (cr, x, y);
-      cairo_translate (cr, width / 2, height / 2);
-      cairo_transform (cr, &matrix);
-      cairo_translate (cr, -width / 2, -height / 2);
+      /* XXX: Implement -gtk-icon-transform-origin instead of hardcoding "50% 50%" here */
+      cairo_matrix_init_translate (&matrix, width / 2, height / 2);
+      cairo_matrix_multiply (&matrix, &transform_matrix, &matrix);
+      cairo_matrix_translate (&matrix, - width / 2, - height / 2);
 
-      if (!_gtk_css_shadows_value_is_none (shadows))
+      if (_gtk_css_shadows_value_is_none (shadows))
+        {
+          cairo_transform (cr, &matrix);
+          _gtk_css_image_draw (image, cr, width, height);
+        }
+      else
         {
           cairo_push_group (cr);
+          cairo_transform (cr, &matrix);
           _gtk_css_image_draw (image, cr, width, height);
           cairo_pop_group_to_source (cr);
           _gtk_css_shadows_value_paint_icon (shadows, cr);
+          cairo_paint (cr);
         }
-      
-      _gtk_css_image_draw (image, cr, width, height);
     }
 
   return TRUE;